package onez.project.common.utils;

import java.lang.reflect.Method;
import java.util.Properties;


public class PropertiesUtils {

    /**
     * 将Properties对象中的属性值注入到指定的JavaBean对象中
     * 该方法会根据属性键值对，自动匹配JavaBean中的setter方法，并设置相应的属性值
     *
     * @param p Properties对象，包含需要注入的属性键值对
     * @param object 需要注入属性的JavaBean对象
     * @param prefix 属性键的前缀，用于匹配Properties中的键
     */
    public static void properties2object(final Properties p, final Object object, String prefix) {
        // 获取对象的所有方法
        Method[] methods = object.getClass().getMethods();
        for (Method method : methods) {
            String methodName = method.getName();
            // only查找并处理所有以"set"开头的方法，通常是setxx属性
            if (methodName.startsWith("set")) {
                try {
                    // 提取属性名的首字母小写形式，用于构造属性键
                    String tmp = methodName.substring(4);
                    String first = methodName.substring(3, 4);
                    String key = prefix + first.toLowerCase() + tmp;//最后拼接成GATEWAY_find、gateway.find、find类似的key
                    // 从Properties中获取与构造的键对应的属性值
                    String property = p.getProperty(key);
                    if (property != null) {
                        // 获取方法的参数类型
                        Class<?>[] parameterTypes = method.getParameterTypes();
                        if (parameterTypes.length > 0) {
                            String cn = parameterTypes[0].getSimpleName();
                            Object arg = null;
                            // 根据参数类型，将属性值转换为相应类型并创建参数对象
                            if (cn.equals("int") || cn.equals("Integer")) {
                                arg = Integer.parseInt(property);
                            } else if (cn.equals("long") || cn.equals("Long")) {
                                arg = Long.parseLong(property);
                            } else if (cn.equals("double") || cn.equals("Double")) {
                                arg = Double.parseDouble(property);
                            } else if (cn.equals("boolean") || cn.equals("Boolean")) {
                                arg = Boolean.parseBoolean(property);
                            } else if (cn.equals("float") || cn.equals("Float")) {
                                arg = Float.parseFloat(property);
                            } else if (cn.equals("String")) {
                                arg = property;
                            } else {
                                // 如果参数类型不匹配，跳过当前属性
                                continue;
                            }
                            // 使用反射调用setter方法，为对象设置属性值
                            method.invoke(object, arg);
                        }
                    }
                } catch (Throwable ignored) {
                    // 异常处理：此处忽略所有异常，确保程序继续执行
                }
            }
        }
    }
    
    public static void properties2object(final Properties p, final Object object) {
        properties2object(p, object, "");
    }
 
}
